home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 2
/
SPACE - Library 2 - Volume 1.iso
/
apps
/
671
/
doc
/
tricks.doc
< prev
Wrap
Text File
|
1992-09-20
|
15KB
|
430 lines
===============================================
@(#) OKAMI SHELL VERSION 1.5 - TIPS UND TRICKS
===============================================
Stand: 19.9.1992
BITTE ERST DIE DATEIEN README UND OKAMI.DOC LESEN!
----------------------------------------------------------------------------
INHALT
Profile
Aufruf von Programmen
Benutzung der Shell von Diskette aus
Beispiel-Shellscripts
okback.sh
e.sh
showpic.sh
startprg.sh
Shell-Funktionen
Die gemexec-Funktion
Die screensave-Funktion
Speichern und Restaurieren der Shell-Einstellungen
MS-DOS-Gefühle
C-Shell-Gefühle
Andere Shells: Gulam, Master und bash
Die Versionsnummer der Shell
Diverses
Trikolor-Bildschirm
Aufruf vom Desktop
Uneindeutige Kommandonamen
Compiler-Aufruf
Ändern von Dateinamen-Extendern
Programmierung des UPN-Rechners
----------------------------------------------------------------------------
PROFILE
Ich benutze das folgende Profile zum Konfigurieren der Shell.
# Okami-Shell - System-Profile
# Terminaleinstellung (für Termcap etc.)
TERM=st
# Cursor etwas schneller blinkend
cursor +bv 12
# Aktuelles Directory im Prompt anzeigen
PS1=['$CWD'] ^^^$' '
# Pipes auf die Ramdisk
PIPDIR=M:\
# Nach Ende der Shell CWD sichern...
set +s
# ...und den Cursor abschalten
trap cursor -v
# Directories trennen wie in Unix mit Slash
set +b
# anmelden als Applikation, sollte man immer machen
gon
# Word Wrap On
echo ^033v
# Bidschirm löschen durch viele Leerzeilen
echo "^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n^n"
# Einschaltmeldung
echo
echo Atari Mega-ST 4 ($TERM)
# Versionsnummer der Shell, des TOS und von MiNT
ver -otM
echo
# Ausgabe des Datums des letzten Logins
cat lastlog 2>NULL:
echo
# Ausgabe des freien Speichers
echo Free RAM: `mem` Bytes
echo
# Ausgabe in invertierter Schrift
echo ^033pType help for command survey.^033q
echo
# Datum speichern
echo Last Login: `date` >lastlog
# Letztes CWD zurückholen
cd `cat wdir`
Laufwerk M ist eine Ramdisk, die die Aufgabe hat, die Pipe-Operationen
zu beschleunigen. Dadurch, daß die Pipe auf die Ramdisk gelegt wird
(PIPDIR=M:\), erfolgen alle Pipe-Operationen ohne Plattenzugriff.
Durch die Einstellung "set +s" wird die Shell veranlaßt, vor dem Pro-
grammende das aktuelle Verzeichnis in die Datei $HOME\wdir zu schreiben.
Das Profile benutzt diese Datei, um das aktuelle Verzeichnis wieder auf
den alten Wert einzustellen. So ist man nach dem Start der Shell immer
in dem Verzeichnis, in dem man war, als man die Shell zuletzt verlassen
hatte.
Durch die Einstellung "set +x" werden in einer Eingabe alle Slashes (/)
in Backslashes (\) umgeformt, wodurch man die Möglichkeit hat,
Dateinamen wie in Unix einzugeben, also shell/bin/sh.ttp anstatt
shell\bin\sh.ttp. Natürlich erzeugt dann das Kommando
echo 6/3=2
die Ausgabe
6\3=2
, da alle Slashes umgeformt werden, aber das stört normalerweise nicht.
(den UPN-Rechner stört es übrigens auch nicht, da er den Backslash als-
Divisionszeichen versteht. Aus "upn 6 3 /" wird also "upn 6 3 \".)
Außerdem kann man sich in Notfällen mit einfachen Anführungszeichen
retten,
echo '6/3=2'
ergibt also immer
6/3=2
.
----------------------------------------------------------------------------
AUFRUF VON PROGRAMMEN
(Der folgende Abschnitt ist im wesentlichen für Festplattenbenutzer von
Interesse.)
Viele Programme gehen davon aus, das sich gewisse Dateien wie z.B. RSCs
im aktuellen Verzeichnis befinden. Um ein solches Kommando zu starten,
muß man also mit cd in das jeweilige Verzeichnis wechseln, was unter
Umständen einige Tipparbeit macht, vor allem bei einer Festplatte. Mit
der Okami-Shell ist es möglich, Programme von überall, also von jedem
beliebigen aktuellen Verzeichnis aus zu starten.
Es sei z.B. GEMTEST.PRG ein Programm, das im Verzeichnis
D:\PROG\GEMTEST steht und eine RSC-Datei aus dem aktuellen Verzeichnis
nachladen muß.
Zum Start des Programms müßte man also eingeben
cd d:\prog\gemtest
gemtest
Man kann allerdings auch so vorgehen:
Man erzeugt sich eine Datei namens GEMTEST.SH im Verzeichnis $HOME\bin,
die ungefähr so aussieht:
A=`set -`
set +x
d:\prog\gemtest.prg
set $A
unset A
Zuerst wird die aktuelle Einstellung der Flags in der Shellvariablen A
gespeichert, danach wird das Flag x aktiviert. Wenn dieses Flag
aktiviert ist, führt die Shell vor dem Start eines Binärprogramms ein cd
in das Directory aus, in dem sich das Programm befindet. Nach dem Ende
des Programms wird das ursprüngliche Directory wieder restauriert.
Danach wird das Programm gestartet.
Nach Programmende werden die Shell-Flags werden auf den gespeicherten
Wert zurückgesetzt. Danach wird die lokal verwendete Shellvariable A
freigegeben.
Wenn das Flag -x immer gesetzt ist, kann man denselben Effekt erreichen
durch:
hash gemtest d:/prg/gemtest/gemtest.prg
Normalerweise ist das Flag x immer aktiviert. Programme, die sich in
einem der in der Shellvariablen PATH gespeicherten Directories befinden,
werden also immer korrekt gestartet, indem man nur ihren Namen eingibt.
----------------------------------------------------------------------------
BENUTZUNG DER SHELL VON DISKETTE AUS
Wenn möglich, sollte man die Shell auf einem schnellen Massespeicher
wie Festplatte oder Ramdisk installieren. Wer die Shell hauptsächlich
mit Disketten benutzt, ärgert sich vermutlich darüber, daß es ziemlich
lange dauert, bis ein falsch eingetipptes Kommando als solches erkannt
wird, da die Shell in allen möglichen Ordnern auf der Diskette nach
einer passenden Datei sucht. Mit den folgenden Einstellungen im Profile
kann die An- zahl dieser Suchoperationen minimiert werden:
PATH=.,$HOME\bin
CDPATH=.
Wenn man den Programm-Suchpfad auf das aktuelle Directory abkürzt (mit
der Einstellung "PATH=."), werden noch weniger Suchoperationen
durchgeführt, man kann dann allerdings die mitgelieferten externen Kom-
mandos, die sich in dem Directory $HOME\bin befinden sollten, nicht
mehr von überallher durch den einfachen Kommandonamen aufrufen, sondern
muß den ganzen Pfad angeben (z.B. nicht einfach "format", sondern
"$HOME\bin\format.ttp").
----------------------------------------------------------------------------
BEISPIEL-SHELLSCRIPTS
1) okback.sh
Ich benutze das folgende Shellscript zum Sichern der Quelldateien der
Shell auf Diskette. Es wird ein lzh-Archiv auf der Diskette angelegt, in
das die seit dem letzten Backup geänderten Dateien hineingeschrieben
werden.
# Temporär-Directory
DIR=M:/tmp/okbak
# Liste der zu sichernden Dateien
FILES=*.c *.h sh.prj doc/*.nr
alert stop 1 "Bitte die Okami-Backup-^|Diskette einlegen." ^
"Ok^|Abbruch" ERG
if [ $ERG = 2 ]
then
exit
fi
# Temp-Dir anlegen und Archiv von der Diskette hineinkopieren
mkdir -r $DIR/
cp -v a:/okbak.lzh $DIR
# geänderte Dateien ins Archiv einfügen.
# lharc ist ein externes Kommando.
lharc a -by $DIR/okbak.lzh $FILES
# Archiv wieder auf Diskette speichern
cp -v $DIR/okbak.lzh a:/
# Log-Eintrag auf der Diskette erzeugen
echo Okami-Source-Backup vom `date` >>a:/okbak.log
# Temp-Directory entfernen
rm -r $DIR
unset DIR FILES ERG
2) e.sh
Das Shellscript e.sh dient zum Aufruf des Editors. Das Editorprogramm
befindet sich in der Datei $HOME\bin\editor.prg. Durch die Verwendung
dieses Shellscripts ist es möglich, irgendwo im Dateisystem den Editor
für irgendeine Datei aufzurufen.
FILE=$*
if [ -v FILE ]
then
FILE=$EFILE
fi
FILE=`fullname $FILE`
$HOME/bin/editor.prg $FILE
EFILE=$FILE
unset FILE
Der Name der zu editerenden Datei wird dem Script als Parameter
übergeben.
Die Zeile "FILE=`fullname $FILE`" erzeugt in der Variablen FILE den
absoluten Dateinamen, der dem Editorprogramm als Parameter übergeben
wird.
Wenn dieses Script ohne Parameter aufgerufen wird, so wird der in der
Shellvariablen EFILE gespeicherte Dateiname benutzt. In dieser Variablen
wird nach jedem Editoraufruf der jeweilige Dateiname gespeichert, so daß
man, wenn man dieselbe Datei mehrmals hintereinander editieren möchte,
den Dateinamen nur einmal angeben muß:
e datei.txt editieren von datei.txt
e datei2.txt editieren von datei2.txt
e ebenfalls datei2.txt
Ggfs. muß man dieses Script noch erweitern, um dem Editor mehrere
Parameter zu übergeben (für den Micro-Emacs z.B. den Namen der
Konfigurationsdatei o.ä.).
3) showpic.sh
Dieses Script zeigt, wie man die Shell programmieren kann. Es dient
dazu, Bilddateien, die im Bitmap-Screenformat abgespeichert wurden
(Dateilänge >32000 Bytes), zu laden und anzuzeigen. Es gehört zum
Lieferumfang der Shell, die Bedienungsanleitung befindet sich in
commands.doc.
4) startprg.sh
Die Idee zu diesem Shellscript stammt von Thomas Behrens aus Eschweiler
und lautet, ein Programm in einer Fileselectbox auszuwählen und dann zu
starten. Dazu genügt eigentlich die folgende Zeile:
fsel | xargs {}
oder noch einfacher
`fsel`
, wenn man aber den Abbruch-Button der Box abtesten und dem Programm
eine Parameterzeile übergeben will, sollte man folgendes Script
benutzen:
FILE=`fsel *.* "" KEY "Welches Programm ausführen?"`
if [ $KEY = 1 ]
then
echo "Bitte Kommandozeile eingeben:"
read CMD
$FILE $CMD
fi
unset FILE KEY CMD
Beide Lösungen funktionieren übrigens sowohl mit Binärprogrammen als
auch mit Shellscripts.
---------------------------------------------------------------------------
SHELL-FUNKTIONEN
Natürlich sollte man alle häufig gebrauchten Shellscripts resident
halten, und zwar als Shellfunktionen. Es ist möglich, ein Shellscript so
zu schreiben, daß es sich beim ersten Aufruf selber als Funktion
installiert; bei allen weiteren Aufrufen wird dann die Funktion benutzt.
Sei z.B. folgendes Shellscript in der Datei hallo.sh, also unter dem
Namen hallo aufzurufen:
echo Hallo Anwender!
echo Der freie Speicherplatz beträgt `mem` Bytes.
echo Auf Platte C: sind `df -f c:` Bytes frei.
Setzt man nun die Zeilen
hallo()
{
an den Beginn und die Zeilen
}
hallo
an das Ende dieses Scripts, also so:
hallo()
{
echo Hallo Anwender!
echo Der freie Speicherplatz beträgt `mem` Bytes.
echo Auf Platte C: sind `df -f c:` Bytes frei.
}
hallo
, so wird beim Start des Scripts die Shellfunktion hallo installiert,
und bei jedem weiteren Aufruf von hallo wird nicht das Script, sondern
die Funktion aufgerufen. Mit dem Kommando
unset hallo
kann man die Funktion wieder aus dem Speicher entfernen.
Die Shellfunktionen machen übrigens eine alias-Funktion völlig
überflüssig, da sie auch benutzt werden können, um interne Kommandos
umzudefinieren: Wer anstelle von ls lieber ls -C hat, gibt einfach ein
ls()
{
!ls -C $*
}
Das Ausrufezeichen verhindert, daß sich die ls-Funktion selber aufruft.
!ls ist immer das interne Kommando ls. Wer irgendwann das normale ls
benutzen will, kann das tun, indem er es als !ls aufruft.
Ebenso helfen Shellfunktionen, Tippfehler zu vermeiden; wer ständig dor
oder dior statt dir tippt, versuche
dior()
{
dir $*
}
(Wer sich wundert, daß die Okami-Shell trotzdem ein alias-Kommando hat:
das dient nur dazu, das Anlegen dieser Mini-Funktionen einfacher zu
gestalten und um Shellscripts anderer Shells ausführen zu können. Man
kann also ebenso schreiben:
alias ls !ls -C
und
alias dior dir
.)
Mein Unix-Tippfehler-Script enthält mehrere Dutzend Schreibweisen der
häufig benutzten Kommandos wie dir, grep und der Make-Aufrufe xmake,
qmake und remake.
Besondere Funktionen haben die vordefinierten (aber vom Anwender
vollständig umdefinierbaren) Shellfunktionen gemexec und screensave, die
in den folgenden Abschnitten beschrieben werden.
---------------------------------------------------------------------------
DIE GEMEXEC-FUNKTION
Mit der kann man wirklich einiges machen, denn sie gibt dem Anwender
die Möglichkeit, das Verhalten der Shell beim Start von GEM-Programmen
frei zu programmieren. Dabei stehen ihm alle die nicht zu
unterschätzenden Funktionen der Shell zur Verfügung.
Die folgende gemexec-Funktion kann benutzt werden, um nach dem Ende
eines GEM-Programms den Bildschirm wieder so herzustellen, wie er vor
dem Aufruf war.
Dazu werden die internen Kommandos getscr und putscr sowie die
VT52-Sequenzen zum Speichern und Wiederherstellen der Cursorposition
benutzt. Dabei werden allerdings 32000 Bytes zum Speichern des
Bildschirminhaltes belegt. Aus diesem Grund speichert die Funktion den
Bildschirm nur dann, wenn die Shellvariable SAVESCR gesetzt ist. Man
kann das Spei